//
//  CN_BaseNavController.swift
//  douyu22
//
//  Created by 朱军华 on 2023/11/30.
//

import UIKit


/*
 
 open class CN_BaseNavController : UINavigationController, UINavigationControllerDelegate {

     /// 不要使用这个属性, 请使用 CN_BaseController 的cn_backBlock属性
     /// 需要注意的是，不管是在 self.cn_backBlock 中弹窗还是其他操作，都是在执行return 值以后的操作，如果是弹出一个弹窗控制器，则当前控制器将不pop
     public var cn_backBlock: (() -> (Bool))?

     /// cn_backBlock <=> cn_pop
     /// 当控制器中使用了 cn_backBlock 时，是触发了返回的方法（点击返回按钮或箭头或滑动返回），此时，想要通过在别的控件添加事件返回上个页面，就必须更改这个属性为 cn_pop 为 true 进行pop返回上个页面，是为了对应 cn_backBlock 的，当然也可以替代self.navigationController?.popViewController(animated: true)，在没有使用cn_backBlock的时候才可以使用self.navigationController?.popViewController(animated: true)
     ///
     /// 不要使用这个属性, 请使用 CN_BaseController 的cn_popStart属性
     /// 当通过在别的控件添加事件触发 popToViewC、popToRootViewC时，直接使用 popToViewC、popToRootViewC 即可。cn_pop 仅是返回上个页面
     public var cn_pop: Bool

     override open func viewDidLoad()

     override open func pushViewController(_ viewController: UIViewController, animated: Bool)

     override open func popViewController(animated: Bool) -> UIViewController?

     /// 通过点击返回按钮或箭头或滑动返回，会首先触发上面的popViewController，然后触发该方法
     /// 所以要将触发返回按钮或箭头或滑动返回的 cn_backBlock 中加上 return false
     override open func popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]?

     /// 通过点击返回按钮或箭头或滑动返回，会首先触发上面的popViewController，然后触发该方法
     /// 所以要将触发返回按钮或箭头或滑动返回的 cn_backBlock 中加上 return false
     override open func popToRootViewController(animated: Bool) -> [UIViewController]?

     /// - UINavigationControllerDelegate
     open func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)

     open func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)

     override open var childForHomeIndicatorAutoHidden: UIViewController? { get }

     override open var childViewControllerForPointerLock: UIViewController? { get }

     override open var childForScreenEdgesDeferringSystemGestures: UIViewController? { get }

     override open var preferredStatusBarStyle: UIStatusBarStyle { get }

     ///- 状态栏更新动画
     override open var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { get }

     /// 状态栏是否隐藏
     override open var prefersStatusBarHidden: Bool { get }
 }

 extension CN_BaseNavController : UIGestureRecognizerDelegate {

     open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
 }

 
 
 
 */




open class CN_BaseNavController: UINavigationController, UINavigationControllerDelegate {
    
    /// 不要使用这个属性, 请使用 CN_BaseController 的cn_backBlock属性
    /// 需要注意的是，不管是在 self.cn_backBlock 中弹窗还是其他操作，都是在执行return 值以后的操作，如果是弹出一个弹窗控制器，则当前控制器将不pop
    public var cn_backBlock: (()->())?
    
    /// cn_backBlock <=> cn_pop
    /// 当控制器中使用了 cn_backBlock 时，是触发了返回的方法（点击返回按钮或箭头或滑动返回），此时，想要通过在别的控件添加事件返回上个页面，就必须更改这个属性为 cn_pop 为 true 进行pop返回上个页面，是为了对应 cn_backBlock 的，当然也可以替代self.navigationController?.popViewController(animated: true)，在没有使用cn_backBlock的时候才可以使用self.navigationController?.popViewController(animated: true)
    ///
    /// 不要使用这个属性, 请使用 CN_BaseController 的cn_popStart属性
    /// 当通过在别的控件添加事件触发 popToViewC、popToRootViewC时，直接使用 popToViewC、popToRootViewC 即可。cn_pop 仅是返回上个页面
    public var cn_pop: Bool = false
    
    
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .default
    }
    
    ///- 状态栏更新动画
    override open var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        return .fade
    }
    
    /// 状态栏是否隐藏
    override open var prefersStatusBarHidden: Bool {
        return false
    }
    
    
    
    
    open override func viewDidLoad() {
        super.viewDidLoad()
        
        self.interactivePopGestureRecognizer?.isEnabled = false
    }
    
    open override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        if self.children.count > 0 {
            viewController.hidesBottomBarWhenPushed = true
        }
        super.pushViewController(viewController, animated: animated)
    }
    open override func popViewController(animated: Bool) -> UIViewController? {
        
        return super.popViewController(animated: animated)
    }
    
    
    override open func popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]? {
        return super.popToViewController(viewController, animated: animated)
    }

    /// 通过点击返回按钮或箭头或滑动返回，会首先触发上面的popViewController，然后触发该方法
    /// 所以要将触发返回按钮或箭头或滑动返回的 cn_backBlock 中加上 return false
    override open func popToRootViewController(animated: Bool) -> [UIViewController]? {
        return super.popToRootViewController(animated: animated)
    }
    
}


